PreparedStatement执行下面语句时,如下:A) SELECT   G.C_GID FROM   GIJUTSUSYA   G WHERE     G.C_GIJUTSU   =  ?  
B) SELECT   G.C_GID FROM   GIJUTSUSYA   G WHERE     G.C_GIJUTSU   =   '11111111' 为什么a语句有使用索引,b语句却没有使用索引?
mssql、oracle都是相同的情况

解决方案 »

  1.   

    若A语句使用了索引而B语句没有使用索引,说明B语句的索引失效了,最有可能就是类型强转导致索引失效
    你看看表结构,GIJUTSUSYA 表中的C_GIJUTSU 字段是不是varchar类型的,若不是,则索引会失效
      

  2.   

    好像是我的测试代码不正确引起的,结贴
    public static void main(String[] arg) {
            try{
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                String url = "jdbc:sqlserver://localhost:1433;DatabaseName=zjygj;sendStringParametersAsUnicode=false";
                String user = "sa";
                String password = "aa";
        
                Connection cnt = DriverManager.getConnection(url, user, password);
                test1(cnt);
                test2(cnt);
                test3(cnt);
                cnt.close(); 
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
        
        private static void test1(Connection cnt) throws SQLException{
            long t1 = System.currentTimeMillis();
            Statement st = cnt.createStatement();
            ResultSet rs = st.executeQuery("SELECT count(*) FROM IESK_STOCKTRANSITEM where rescode = '0702102076'");
            System.out.print(rs.next()?"true":"false");
            long t2 = System.currentTimeMillis(); 
            rs.close();
            st.close(); 
            System.out.println(">\tStatement:\t" + (t2-t1));
        }
        private static void test2(Connection cnt) throws SQLException{
            long t1 = System.currentTimeMillis();
            PreparedStatement st = cnt.prepareStatement("SELECT count(*) FROM IESK_STOCKTRANSITEM where rescode = '0702102076'");
            ResultSet rs = st.executeQuery();
            System.out.print(rs.next()?"true":"false");
            long t2 = System.currentTimeMillis(); 
            rs.close();
            st.close(); 
            System.out.println(">\t没有参数:\t\t" + (t2-t1));
        }
        private static void test3(Connection cnt) throws SQLException{
            long t1 = System.currentTimeMillis();
            PreparedStatement st = cnt.prepareStatement("SELECT count(*) FROM IESK_STOCKTRANSITEM where rescode = ?");
            st.setString(1, "0702102076");
            ResultSet rs = st.executeQuery();
            System.out.print(rs.next()?"true":"false");
            long t2 = System.currentTimeMillis(); 
            rs.close();
            st.close(); 
            System.out.println(">\t有参数:\t\t" + (t2-t1));
        }