Udostępnij przez


Rzadkie kolumny

pobierz sterownik JDBC

Kolumny rzadkie to zwykłe kolumny, które mają zoptymalizowane przechowywanie dla wartości null. Kolumny rzadkie zmniejszają wymagania dotyczące miejsca dla wartości null kosztem większego obciążenia przy pobieraniu wartości innych niż null. Rozważ użycie kolumn rzadszych, gdy zapisane miejsce wynosi co najmniej od 20% a 40%.

Sterownik JDBC programu SQL Server 3.0 obsługuje kolumny rozrzedzone podczas łączenia się z serwerem, na którym działa SQL Server 2008 (10.0.x) i nowsze wersje. Można użyć sqlServerDatabaseMetaData.getColumns, SQLServerDatabaseMetaData.getFunctionColumns lub SQLServerDatabaseMetaData.getProcedureColumns , aby określić, która kolumna jest rozrzedzona i która kolumna jest kolumną zestawu kolumn.

Plik kodu dla tego przykładu ma nazwę SparseColumns.java i można go znaleźć w następującej lokalizacji:

\<installation directory>\sqljdbc_<version>\<language>\samples\sparse

Zestawy kolumn to obliczone kolumny, które zwracają wszystkie rozrzedzone kolumny w nietypowym formularzu XML. Rozważ użycie zestawów kolumn, gdy liczba kolumn w tabeli jest duża, większa niż 1024 lub gdy operowanie na pojedynczych kolumnach rzadkich jest uciążliwe. Zestaw kolumn może zawierać maksymalnie 30 000 kolumn.

Example

Description

W tym przykładzie pokazano, jak wykrywać zestawy kolumn. Pokazano również, jak analizować wynik XML zestawu kolumn, aby uzyskać dane z kolumn rozrzedzonych.

Lista kodu to kod źródłowy Java. Przed skompilowanie aplikacji zmień parametry połączenia.

Code

import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;


public class SparseColumns {

    public static void main(String args[]) {

        // Create a variable for the connection string.
        String connectionUrl = "jdbc:sqlserver://<server>:<port>;encrypt=true;databaseName=AdventureWorks;user=<user>;password=<password>";

        try (Connection con = DriverManager.getConnection(connectionUrl); Statement stmt = con.createStatement()) {

            createColdCallingTable(stmt);

            // Determine the column set column
            String columnSetColName = null;
            String strCmd = "SELECT name FROM sys.columns WHERE object_id=(SELECT OBJECT_ID('ColdCalling')) AND is_column_set = 1";

            try (ResultSet rs = stmt.executeQuery(strCmd)) {
                if (rs.next()) {
                    columnSetColName = rs.getString(1);
                    System.out.println(columnSetColName + " is the column set column!");
                }
            }

            strCmd = "SELECT * FROM ColdCalling";
            try (ResultSet rs = stmt.executeQuery(strCmd)) {

                // Iterate through the result set
                ResultSetMetaData rsmd = rs.getMetaData();

                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                DocumentBuilder db = dbf.newDocumentBuilder();
                InputSource is = new InputSource();
                while (rs.next()) {
                    // Iterate through the columns
                    for (int i = 1; i <= rsmd.getColumnCount(); ++i) {
                        String name = rsmd.getColumnName(i);
                        String value = rs.getString(i);

                        // If this is the column set column
                        if (name.equalsIgnoreCase(columnSetColName)) {
                            System.out.println(name);

                            // Instead of printing the raw XML, parse it
                            if (value != null) {
                                // Add artificial root node "sparse" to ensure XML is well formed
                                String xml = "<sparse>" + value + "</sparse>";

                                is.setCharacterStream(new StringReader(xml));
                                Document doc = db.parse(is);

                                // Extract the NodeList from the artificial root node that was added
                                NodeList list = doc.getChildNodes();
                                Node root = list.item(0); // This is the <sparse> node
                                NodeList sparseColumnList = root.getChildNodes(); // These are the xml column nodes

                                // Iterate through the XML document
                                for (int n = 0; n < sparseColumnList.getLength(); ++n) {
                                    Node sparseColumnNode = sparseColumnList.item(n);
                                    String columnName = sparseColumnNode.getNodeName();
                                    // The column value is not in the sparseColumNode, it is the value of the
                                    // first child of it
                                    Node sparseColumnValueNode = sparseColumnNode.getFirstChild();
                                    String columnValue = sparseColumnValueNode.getNodeValue();

                                    System.out.println("\t" + columnName + "\t: " + columnValue);
                                }
                            }
                        } else { // Just print the name + value of non-sparse columns
                            System.out.println(name + "\t: " + value);
                        }
                    }
                    System.out.println();// New line between rows
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void createColdCallingTable(Statement stmt) throws SQLException {
        stmt.execute("if exists (select * from sys.objects where name = 'ColdCalling')" + "drop table ColdCalling");

        String sql = "CREATE TABLE ColdCalling  (  ID int IDENTITY(1,1) PRIMARY KEY,  [Date] date,  [Time] time,  PositiveFirstName nvarchar(50) SPARSE,  PositiveLastName nvarchar(50) SPARSE,  SpecialPurposeColumns XML COLUMN_SET FOR ALL_SPARSE_COLUMNS  );";
        stmt.execute(sql);

        sql = "INSERT ColdCalling ([Date], [Time])  VALUES ('10-13-09','07:05:24')  ";
        stmt.execute(sql);

        sql = "INSERT ColdCalling ([Date], [Time], PositiveFirstName, PositiveLastName)  VALUES ('07-20-09','05:00:24', 'AA', 'B')  ";
        stmt.execute(sql);

        sql = "INSERT ColdCalling ([Date], [Time], PositiveFirstName, PositiveLastName)  VALUES ('07-20-09','05:15:00', 'CC', 'DD')  ";
        stmt.execute(sql);
    }
}

Zobacz także

Zwiększanie wydajności i niezawodności dzięki sterownikowi JDBC